package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"net"
	"reflect"
	"strconv"
	"time"
)

var n1 = 8

func main() {
	for i := 0; i < 1; i++ {
		start := time.Now()
		port := "8100"    //"50000"//"8100"
		ip := "127.0.0.1" //"xz502.tpddns.cn"221.196.210.182
		//ip := "221.196.210.182"//"xz502.tpddns.cn"221.196.210.182
		//wavPath := "./tmp/"
		//wavText := "火箭方面，哈登拿到29分8个篮板10次助攻。"
		//wavText :="生活对我们任何人来说都不容易！最重要的是我们必须相信自己。我们必须相信,我们每个人都能够做得很好."
		//wavText :="\"他叫卖着,\"今天早上现摘的鲜草莓,早上刚摘的乡下草莓哟……\" 摩莉看了看安娜"
		//wavText :="在他握住车把将手推车向前推动之前,又抬头看了看窗口,发现只有安娜在那儿"
		//wavText :="都将手携手,合唱一首古老的黑人灵歌, 自由啦."
		wavText := "他压根儿是个城市居民"
		//wavText :="” 对面大楼里走出另一个顾客"
		//wavText :="\"对面大楼里走出另一个顾客"
		//wavText :="生活对我们任何人来说都不容易！我们必须努力，最重要的是我们必须相信自己。我们必须相信，我们每个人都能够做得很好，而且，当我们发现这是什么时，我们必须努力工作，直到我们成功。"
		fmt.Println("" + strconv.Itoa(len(wavText)))
		EOS_TAG := "<EOS>"
		addr := ip + ":" + port            //定义主机名
		conn, err := net.Dial("tcp", addr) //拨号操作，需要指定协议。
		defer conn.Close()
		if err != nil {
			fmt.Println(err.Error())
		}
		fmt.Println("IP:", conn.RemoteAddr().String())
		fmt.Printf("port:%v\n", conn.LocalAddr())
		fmt.Println("conn.LocalAddr():", reflect.TypeOf(conn.LocalAddr()))
		fmt.Println("conn.RemoteAddr().String():", reflect.TypeOf(conn.RemoteAddr().String()))
		n, err := conn.Write([]byte(wavText + EOS_TAG))
		fmt.Println("len:", n)
		if err != nil {
			fmt.Println(err.Error())
		}
		buf := make([]byte, 1024) //定义一个切片的长度是1024。
		fmt.Println("begin1")
		n, err = conn.Read(buf) //接收到的内容大小。
		fmt.Println("len1:", n)
		if err != nil && err != io.EOF {
			fmt.Println(err.Error())
		}
		fmt.Println(buf[:n])
		//fmt.Println(string(buf[:n1])) //将接受的内容都读取出来。
		respLen := Byte2Int(buf[:n])
		fmt.Println(respLen)
		var buf1 []byte = buf[n1:n]
		getLen := len(buf1)
		fmt.Println("begin2")
		for getLen < respLen {
			bufIn := make([]byte, 1024)
			n, err = conn.Read(bufIn) //接收到的内容大小。
			//fmt.Println("lenin:",n)
			if err != nil && err != io.EOF {
				fmt.Println(err.Error())
			}
			getLen = getLen + n
			if getLen <= respLen {
				buf1 = append(buf1, bufIn[:n]...)
			} else {
				//n-(getLen-respLen)
				buf1 = append(buf1, bufIn[:n-(getLen-respLen)]...)
			}
			//fmt.Println("getlen:::"+strconv.Itoa(getLen))
		}
		fmt.Println("get end")
		//8位长度
		//将指定内容写入到文件中
		nameStr := "api-" + time.Now().Format("20190513-0000") + ".wav"
		err = ioutil.WriteFile(nameStr, buf1, 0666)
		if err != nil {
			fmt.Println("ioutil WriteFile error: ", err)
		}
		cost := time.Since(start)
		fmt.Printf("cost=[%s]", cost)

	}
}

func Byte2Int(data []byte) int {
	var ret int = 0
	var len int = len(data)
	var i uint = 0
	for i = 0; i < uint(len); i++ {
		ret = ret | (int(data[i]) << (i * 8))
	}
	return ret
}
